home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / games / shootemup / shootemup.s < prev   
Text File  |  1980-01-03  |  37KB  |  1,548 lines

  1. *****************************************************************************
  2. * Shoot Em Up, By Phagex/LSD 1992/93.       Source & GFX Copyright LSD 1993 *
  3. *****************************************************************************
  4. * Coded in Devpac 3.02, NOT PC RELATIVE!   Disable cache and AGA if crashes *
  5. * on A1200/A4000!!  Sorry i aint fully checked it, but i did get it to run  *
  6. * okay on Pazzas A1200 once!                                                *
  7. *****************************************************************************
  8.  
  9.     Opt    c-
  10.     Section    "LSD Game Code",Code_c
  11.  
  12. *****************************************************************************
  13.  
  14. AlienType    = 3    ; GFX Type for alien, 2 to 6
  15.  
  16. Start    Movem.l    d0-d7/a0-a6,-(sp)  ; Save Regs
  17.     Bsr    KillSys    ; Kill DOS System
  18.  
  19.     Bsr    PlayTheGame
  20.  
  21.     Bsr    ReturnSys       ; Otherwise say goodbye
  22.     Movem.l    (sp)+,d0-d7/a0-a6  ; and put 68000 regs
  23.     Moveq    #0,d0       ; back to system values..
  24.     Rts
  25.     
  26. PlayTheGame    Move.w    #6,Lives    ; Set 6 Lives
  27.     Move.l    #0,Score    ; And score to Nill
  28.     Move.w    #0,DeadCount    ; Reset Ship Explosion
  29.  
  30.     Bsr    DoubleBuffer    ; Setup Piccy Addresses
  31.     Bsr    SetTextBPLS    ; Set CopperList BPLS
  32.     Bsr    DoScore    ; Show Score line
  33.     
  34.     Lea    Piccy1,a0    ; Clear Both Piccy buffers
  35.     Bsr    CLS    ; 
  36.     Lea    Piccy2,a0    ; 
  37.     Bsr    CLS    ; 
  38.     
  39.     Move.l    #CopperList1,$Dff080   ; Set Game Copper
  40.     Lea    $Dff000,a6    ;
  41.     Move.w    #$87c0,DMACon(a6) ; Set DMA
  42.     
  43.     Bsr    SetMouse    ; Reset Mouse X&Y
  44.     Move.w    #152,XPos    ; Set ship start position
  45.     Move.w    #250,YPos    ; X&Y.
  46.     
  47.     Bsr    DoLives    ; Show Player lives
  48.         
  49.     Bsr    ResetALL    ; Reset all variables
  50.  
  51. *****************************************************************************    
  52. * Main Game Processing Loop starts here..                                   *    
  53. *****************************************************************************    
  54.  
  55. Loop    Bsr    ClearBullets    ; Clear the different 
  56.     Bsr    ClearAliens    ; objects on screen
  57.     Bsr    ClearShip    ; individually...
  58.     Bsr    ClearExplosions    ;
  59.     
  60. ***************************************************    
  61.     
  62.     Bsr    MoveBullets    ; Move and show Bullets 
  63.     Bsr    ShowBullets    ; (Fire power)
  64.  
  65.     Bsr    Randomize    ; Randomize Alien X Pos
  66.     Bsr    NewAlien    ; Start a new alien if poss,
  67.     Bsr    MoveAliens    ; Move 'em down screen
  68.     Bsr    CheckBullets    ; Check if they've been shot
  69.     Bsr    ShowAliens    ; Show if otherwise.
  70.     
  71.     Bsr    UpdateExplo     ; Update the Explosion
  72.     Bsr    ShowExplosions     ; Animations & show them
  73.  
  74.     Cmp.w    #0,DeadCount    ; If Dying, skip next few
  75.     Bne    NoBlitShip    ; routines
  76.  
  77.     Bsr    CheckAliens    ; Check for a collision
  78.     Bsr    TrackStick    ; Get JoyStick status,
  79.     Bsr    TrackMouse    ; Get Mouse Position
  80.     Bsr    MoveShip    ; Move ship around screen.
  81.             
  82.     Btst    #0,Altern8    ; Double buffer ships X&Y
  83.     Bne    SPos1    ; positions, for use with
  84.     Move.w    XPos,FCXPos0    ; the clearing routine l8r.
  85.     Move.w    YPos,FCYPos0    ; 
  86.     Bra    SPos2    ; 
  87. SPos1    Move.w    XPos,FCXPos1    ; 
  88.     Move.w    YPos,FCYPos1    ; 
  89.             ; 
  90. SPos2    Bsr    BlitShip    ; Finally show the ship.
  91.  
  92. ***************************************************
  93.  
  94. DoVBL    Bsr    VBL       ; Syncro with Vertical
  95.     Movem.l    d0-d7/a0-a6,-(sp)  ; Blank.
  96.     Bsr    DoubleBuffer       ; Double Buffer Piccy
  97.     Movem.l    (sp)+,d0-d7/a0-a6  ;     
  98.     Bsr    FrameCount       ; Increase Timer
  99.     
  100. ***************************************************    
  101.  
  102.     Cmp.w    #-1,Lives    ; If No lives left then
  103.     Beq    Die    ; GAME OVER!
  104.  
  105.     Btst    #2,$Dff016    ; Loop again if left mouse
  106.     Bne    Loop    ; button not pressed..
  107.     
  108. QuitTheGame    Rts        ; Exit MainLoop
  109.  
  110. NoBlitShip    Sub.w    #1,DeadCount    ; Wait for the ships
  111.     Cmp.w    #0,DeadCount    ; explosion to finish its
  112.     Beq    DoReset    ; animation.
  113.     Bra    DoVBL    ; 
  114.     
  115. DoReset    Bsr    ResetAll    ; Lose a life and
  116.     Bra    Loop    ; return to Loop
  117.     
  118. ResetAll    Lea    BlackOut,a4    ; Fade the Screen palette
  119.     Bsr    FadeOut    ; to black.
  120.  
  121.     Lea    BullTable,a0    ; Clean out bullet table
  122.     Move.w    #11,d7    ; 
  123. BTCLoop    Move.l    #-1,(a0)+    ; 
  124.     Dbf    d7,BTCLoop    ; 
  125.  
  126.     Lea    AlienTable,a0    ; Clean out old Aliens
  127.     Move.w    #29,d7    ; 
  128. ATCLoop    Move.l    #-1,(a0)+    ; 
  129.     Move.l    #-1,(a0)+    ; 
  130.     Dbf    d7,ATCLoop    ; 
  131.  
  132.     Lea    ExploTable,a0    ; Clean out old Explosions
  133.     Move.w    #29,d7    ; 
  134. ETCLoop    Move.l    #-1,(a0)+    ; 
  135.     Move.w    #-1,(a0)+    ; 
  136.     Dbf    d7,ETCLoop    ; 
  137.  
  138.     Lea    Piccy1,a0    ; Clear Picture buffers 1&2
  139.     Bsr    CLS    ; 
  140.     Lea    Piccy2,a0    ; 
  141.     Bsr    CLS    ; 
  142.     
  143.     Bsr    DoScore    ; Show Updated Score line
  144.  
  145.     Move.w    #152,XPos    ; Reset Ships start co-ords.
  146.     Move.w    #250,YPos    ; 
  147.     
  148.     Bsr    DoGetReadyMSG    ; Show GET READY! Text.
  149.     
  150.     Move.w    #$fff,CopperCols+6 ; Get Ready text = White
  151.         
  152.     Move.w    #140,d2    ; Do a quick pause
  153.     Bsr    Pause    ;
  154.  
  155.     Lea    PiccyCols0,a4    ; Fade out GET READY! 
  156.     Bsr    FadeOut    ; 
  157.  
  158.     Lea    Piccy1,a0    ; Clear Picture Buffers
  159.     Bsr    CLS    ; 
  160.     Lea    Piccy2,a0    ; 
  161.     Bsr    CLS    ; 
  162.     Rts        ; Exit to Main Loop
  163.  
  164. Die    Lea    BlackOut,a4    ; Fade out palette to Black
  165.     Bsr    FadeOut
  166.  
  167.     Lea    Piccy1,a0    ; Clear Picture buffers.
  168.     Bsr    CLS    ;
  169.     Lea    Piccy2,a0    ;
  170.     Bsr    CLS    ;
  171.     
  172.     Bsr    DoScore    ; Update Score.
  173.     
  174.     Bsr    DoGameOverMSG    ; Show GAME OVER! Text
  175.     
  176.     Lea    PiccyCols1,a4    ; Fade in Text palette.
  177.     Bsr    FadeOut    ;
  178.     
  179.     Move.w    #250,d2    ; Pause for 5 secs.
  180.     Bsr    Pause    ; 
  181.  
  182.     Lea    BlackOut,a4    ; Fade out Game Over.
  183.     Bsr    FadeOut    ;
  184.  
  185.     Bra    QuitTheGame    ; Quit Loop
  186.     
  187. Pause    Bsr    VBL    ; Quick Loop that Pauses
  188.     Move.w    #$1000,d1    ; until d2 = 0 or Left Mouse
  189. PauseLoop    Dbf    d1,PauseLoop    ; or JoyStick buttons are
  190.     Btst    #6,$Bfe001    ; Pressed.
  191.     Beq    QuitPause    ; 
  192.     Btst    #7,$Bfe001    ; 
  193.     Beq    QuitPause    ; 
  194.     Dbf    d2,Pause    ; 
  195. QuitPause    Rts        ; 
  196.     
  197. FadeOut    Move.w    #16,d7    ; Fade routine to Fade the
  198. FadeOutLoop    Bsr    VBL    ; Palette in the copper list
  199.     Move.w    #$3000,d0    ; to whatever you want.
  200. FadeWait    Dbf    d0,FadeWait    ; 
  201.     Move.l    d7,-(sp)    ; 
  202.     Move.l    a4,a1    ; 
  203.     Bsr    FadeX    ; 
  204.     Move.l    (sp)+,d7    ; 
  205.     Dbf    d7,FadeOutLoop    ; 
  206.     Rts        ; 
  207.     
  208. FadeX    Lea    CopperCOLS+2,a0    ; Get CopperList Palette
  209.     Move.w    #15,d7    ; Set a 16 Colour Loop
  210. FadeLoop    Moveq    #0,d4    ; 
  211.     Move.w    (a0),d0    ; Get Copper Colour
  212.     Move.w    (a1)+,d1    ; Get Colour to Fade to.
  213.             ; 
  214.     Move.w    #$001,d5    ; Get Blue Increment
  215.     Move.w    #$00f,d6    ; Get Blue Colour
  216.     Bsr    DoFadeX    ; Fade Blue
  217.     Move.w    #$010,d5    ; Get Green Inc
  218.     Move.w    #$0f0,d6    ; 
  219.     Bsr    DoFadeX    ; Fade Green
  220.     Move.w    #$100,d5    ; Get Red
  221.     Move.w    #$f00,d6    ; 
  222.     Bsr    DoFadeX    ; Fade Red.
  223.             ; 
  224.     Move.w    d4,(a0)    ; Final result into Copper.
  225.     Addq    #4,a0    ; Next Colour Please!
  226.     Dbf    d7,FadeLoop    ; 
  227.     Rts        ; 
  228.             ; 
  229. DoFadeX    Move.w    d0,d2    ; Fade Routine that takes
  230.     Move.w    d1,d3    ; either Red, Green or Blue
  231.     And.w    d6,d2    ; And Increases or Decreases
  232.     And.w    d6,d3    ; towards the value of the
  233.     Cmp.w    d2,d3    ; chosen colour.
  234.     Blt    FadeXDown    ; 
  235.     Bgt    FadeXUp    ; 
  236.     Bra    NoFadeX    ; 
  237.             ; 
  238. FadeXDown    Sub.w    d5,d2    ; Decrease colour
  239.     Bra    NoFadeX    ; 
  240. FadeXUp    Add.w    d5,d2    ; Increase colour
  241.     Bra    NoFadeX    ; 
  242.             ; 
  243. NoFadeX    Or.w    d2,d4    ; Put new colour back.
  244.     Rts        ; 
  245.  
  246. *****************************************************************************
  247.  
  248. CLS    Move.w    #(10*4*270)-1,d0; Simple Clear screen Loop
  249. CLoop1    Move.l    #0,(a0)+    ; 
  250.     Dbf    d0,CLoop1    ; 
  251.     Rts
  252.  
  253. *****************************************************************************
  254.  
  255. T    = (40*3*20)    ; BitPlane Offset (Hides aliens)
  256.  
  257. DoubleBuffer    Bchg    #0,Altern8    ; Alternate frame swap for
  258.     Btst    #0,Altern8    ; double buffer..
  259.     Bne    DBuffer    ;
  260.  
  261.     Move.l    #Piccy1,Screen    ; Set Blits to Piccy1 and
  262.     Move.l    #Piccy2+T,d0    ; Copperlist to Piccy2
  263.     Lea    Bpl0,a0    ; 
  264.     Bra    SetBPLS    ; Jump to Bitplane Setter
  265.  
  266. DBuffer    Move.l    #Piccy2,Screen    ; Set Blits to Piccy2 and
  267.     Move.l    #Piccy1+T,d0    ; Copperlist to Piccy1
  268.     Lea    Bpl0,a0    ; 
  269.  
  270. SetBPLS    Move.w    #3,d7    ; 
  271. SetBPLoop    Move.l    d0,d1    ; 
  272.     Move.w    d1,6(a0)    ; 
  273.     Swap    d1    ; Set the Bitplanes in the
  274.     Move.w    d1,2(a0)    ; Copperlist to the new
  275.     Add.l    #$28,d0    ; Piccy...
  276.     Add.l    #$8,a0    ; 
  277.     Dbf    d7,SetBPLoop    ; 
  278.     Rts
  279.  
  280. *****************************************************************************
  281.  
  282. SetTextBPLS    Lea    TextBpls,a0    ; Set the text BPLS in the
  283.     Move.l    #TextPiccy,d0    ; CopperList
  284.     Move.w    d0,6(a0)    ;
  285.     Swap    d0    ;
  286.     Move.w    d0,2(a0)    ;
  287.     Rts        ;
  288.  
  289. *****************************************************************************
  290.  
  291. VBL    Move.l    $Dff004,d0    ; Fetch VBL Position
  292.     And.l    #$1ff00,d0    ; 
  293.     Cmp.l    #$02000,d0    ; Wait for Position $20
  294.     Bne    VBL    ; 
  295.     Rts        ; Return when reached..
  296.  
  297. *****************************************************************************
  298.     
  299. FrameCount    Add.w    #1,MSecs    ; Add 1 to Frame 50ths,
  300.     Cmp.w    #50,MSecs    ; 
  301.     Bne    NotSec    ; When 50, clear and add 1
  302.     Move.w    #0,MSecs    ; to Seconds
  303.     Add.w    #1,Secs    ; 
  304.     Cmp.w    #60,Secs    ; 
  305.     Bne    NotSec    ; When 60, clear and add 1
  306.     Move.w    #0,Secs    ; to Minutes
  307.     Add.w    #1,Mins    ; 
  308.     Cmp.w    #60,Mins    ; 
  309.     Bne    NotSec    ; When 60, clear and add 1
  310.     Move.w    #0,Mins    ; to Hours...
  311.     Add.w    #1,Hours    ; 
  312. NotSec    Rts
  313.  
  314. *****************************************************************************
  315.     
  316. MoveShip    Move.b    MoveFlag,d0    ; Get Movement Flags
  317.     Move.w    Speed,d1    ; Get Ship Speed
  318.     Btst    #0,d0    ; Test for Move Right
  319.     Beq    NoR    ; Jump to next test if no
  320.     Add.w    d1,XPos    ; Add Speed to right..
  321.     
  322. NoR    Btst    #1,d0    ; Test for Move Left
  323.     Beq    NoL    ; 
  324.     Sub.w    d1,XPos    ; 
  325.     
  326. NoL    Btst    #2,d0    ; Test for Move Down
  327.     Beq    NoD    ; 
  328.     Add.w    d1,YPos    ; 
  329.     
  330. NoD    Btst    #3,d0    ; Test for Move Up
  331.     Beq    NoU    ; 
  332.     Sub.w    d1,YPos    ; 
  333.     
  334. NoU    Tst.w    XPos    ; Test for X Position 0
  335.     Bpl    NX1    ; if less than 0 (off Screen)
  336.     Move.w    #0,XPos    ; then put back to 0
  337.     
  338. NX1    Tst.w    YPos    ; Test for Y Position 0
  339.     Bpl    NY1    ; if less than 0 (off Screen)
  340.     Move.w    #0,YPos    ; put back to 0
  341.         
  342. NY1    Cmp.w    #299,XPos    ; Test X Pos 299
  343.     Ble    NX2    ; if greater, then off screen
  344.     Move.w    #299,XPos    ; put down to 299
  345.     
  346. NX2    Cmp.w    #240,YPos    ; Test Y Pos 240
  347.     Ble    NY2    ; if greater, then off screen
  348.     Move.w    #240,YPos    ; put down yo 240
  349.     
  350. NY2    Btst    #4,d0    ; Fire button pressed??
  351.     Beq    NoShoot    ; no, then Exit routine
  352.     
  353.     Add.w    #1,BulletCount    ; Count 5 frames before
  354.     Cmp.w    #5,BulletCount    ; releasing another bullet
  355.     Bne    NoShoot    ; (screen becomes cluttered
  356.     Move.w    #0,BulletCount    ; otherwise)
  357.     Bsr    SetBullet    ; Set a bullet if 5th Frame
  358.     
  359. NoShoot    Rts    
  360.  
  361. *****************************************************************************
  362.  
  363. BlitShip    Add.w    #1,Frame    ; Next ship frame
  364.     And.w    #$f,Frame    ; No more than 16 frames
  365.     
  366.     Lea    AlienGFX1,a0    ; Point to the Raw GFX Data
  367.     Lea    AlienMask1,a1    ; Point to the GFX Mask
  368.     Move.w    #0,d0    ; The Sprite Row number
  369.     Move.w    Frame,d1    ; The Frame number
  370.     Move.w    XPos,d2    ; X Co-ord
  371.     Move.w    YPos,d3    ; Y Co-ord
  372.     Move.w    #16,d4    ; Height in Pixels
  373.     Bsr    Blitter
  374.     Rts
  375.  
  376. *****************************************************************************
  377.  
  378. ClearShip    Btst    #0,Altern8    ; 
  379.     Bne    CLPos1    ; 
  380.     Move.w    FCXPos0,d0    ; 
  381.     Move.w    FCYPos0,d1    ; This routine takes the last
  382.     Bra    CLPos2    ; double buffered position
  383. CLPos1    Move.w    FCXPos1,d0    ; and clears the space the
  384.     Move.w    FCYPos1,d1    ; ship takes up..
  385. CLPos2    Move.w    #16,d2    ; 
  386.     Bsr    BlitClear    ; 
  387.     Rts        ; 
  388.  
  389. *****************************************************************************
  390.  
  391. SetBullet    Lea    BullTable,a0    ; 
  392. NextBullet    Move.w    0(a0),d0    ; 
  393.     Move.w    2(a0),d1    ; 
  394.     Cmp.w    #-1,d0    ; Find an unused bullet in
  395.     Beq    FreeBullet    ; the bullet table and set
  396.     Lea    4(a0),a0    ; its new position...
  397.     Cmp.l    #BullEnd,a0    ; 
  398.     Beq    NoMoreBullets    ; 
  399.     Bra    NextBullet    ; 
  400.             ; 
  401. FreeBullet    Move.w    XPos,0(a0)    ; 
  402.     Move.w    YPos,2(a0)    ; 
  403. NoMoreBullets    Rts
  404.  
  405. *****************************************************************************
  406.  
  407. MoveBullets    Lea    BullTable,a0    ; 
  408.     Move.w    BullSpeed,d6    ; 
  409.     Move.w    #7,d7    ; Move all the Active bullets
  410. BullMLoop    Sub.w    d6,2(a0)    ; up the screen..
  411.     Cmp.w    #2,2(a0)    ; 
  412.     Ble    KillBullet    ; Kill the bullet if it 
  413. NextMBull    Add.l    #4,a0    ; reaches the top of the 
  414.     Dbf    d7,BullMLoop    ; screen...
  415.     Rts        ; 
  416. KillBullet    Move.l    #-1,(a0)    ; 
  417.     Bra    NextMBull    ;     
  418.  
  419. *****************************************************************************
  420.     
  421. ShowBullets    Lea    BullTable,a5    ; 
  422.     Btst    #0,Altern8    ; 
  423.     Bne    Save1    ; Now read the bullet table
  424.     Lea    FCBullets0,a4    ; and blit all the active
  425.     Bra    Save2    ; bullets...
  426. Save1    Lea    FCBullets1,a4    ; 
  427. Save2    Move.w    #7,d7    ; 
  428. DoSBulls    Move.w    (a5)+,d2    ; 
  429.     Move.w    (a5)+,d3    ; 
  430.             ;
  431.     Move.w    d2,(a4)+    ;
  432.     Move.w    d3,(a4)+    ;
  433.             ;
  434.     Cmpi.w    #-1,d2    ;
  435.     Beq    NoShowBullet    ;
  436.             ;
  437.     Lea    AlienGFX1,a0    ;
  438.     Lea    AlienMask1,a1    ;
  439.     Move.w    #0,d0    ;
  440.     Move.w    #19,d1    ;
  441.     Move.w    #8,d4    ;
  442.     Bsr    Blitter    ;
  443.             ;
  444. NoShowBullet    Dbf    d7,DoSBulls    ;
  445.     Rts
  446.  
  447. *****************************************************************************
  448.  
  449. ClearBullets    Btst    #0,Altern8    ;
  450.     Bne    Load1    ;
  451.     Lea    FCBullets0,a5    ; Now read the Double
  452.     Bra    Load2    ; buffered list of bullets
  453. Load1    Lea    FcBullets1,a5    ; and clear active ones..
  454. Load2    Move.w    #7,d7    ;
  455. DoCBulls    Move.w    (a5)+,d0    ;
  456.     Move.w    (a5)+,d1    ;
  457.             ;
  458.     Cmpi.w    #-1,d0    ;
  459.     Beq    NoClearBullet    ;
  460.             ;
  461.     Move.w    #8,d2    ;
  462.     Bsr    BlitClear    ;
  463.             ;
  464. NoClearBullet    Dbf    d7,DoCBulls    ;
  465.     Rts
  466.  
  467. *****************************************************************************
  468.     
  469. Blitter    Lea    $Dff000,a6    ; Base of the Custom Regs
  470.     Move.l    #(40*4*16),d5
  471.     And.l    #63,d0
  472.     Muls    d0,d5    ; Find Address of GFX Row
  473.     
  474.     Move.w    d1,d0
  475.     Asl.w    #1,d0    ; Find Address of Frame
  476.     
  477.     Add.l    d0,a0    ;    
  478.     Add.l    d0,a1    ; Add Frame & Row to both
  479.     Add.l    d5,a0    ; GFX and Mask Pointers
  480.     Add.l    d5,a1    ;
  481.     
  482.     Move.l    Screen,a2    ; Point to Screen Base
  483.     Move.w    d3,d0    ; Get Y Co-ord
  484.     Move.l    #$28*4,d1    ;
  485.     Muls    d0,d1    ; Find Y Co-ord pos and Add
  486.     Add.l    d1,a2    ; to the Screen Pointer
  487.     
  488.     Move.w    d2,d0    ; Get X Co-ord
  489.     Moveq    #0,d1    ;
  490.     Move.w    d0,d1    ; 
  491.     Asr.w    #3,d1    ; Divide by 8 pixels,
  492.     Bclr    #0,d1    ; Make sure even number
  493.     Add.l    d1,a2    ; and to Screen Pointer
  494.     
  495.     And.w    #$f,d0    ; Get Blitter Offset
  496.     
  497.     Bsr    BWait    ; Wait For Blitter
  498.     
  499.     Move.l    a1,BltApth(a6)    ; Mask Pointer
  500.     Move.l    a0,BltBpth(a6)    ; GFX Pointer
  501.     Move.l    a2,BltCpth(a6)    ; Screen Pointer
  502.     Move.l    a2,BltDpth(a6)    ; Screen Pointer
  503.     
  504.     Move.w    #36,BltAMod(a6)    ; Set all Modulos to 36
  505.     Move.w    #36,BltBMod(a6)    ; 
  506.     Move.w    #36,BltCMod(a6)    ; 
  507.     Move.w    #36,BltDMod(a6)    ; 
  508.     
  509.     Move.l    #$ffff0000,BltAFWM(a6)  ; Set Mask
  510.     
  511.     Lea    BConShift,a0    ; Now find our Control code
  512.     Asl.w    #2,d0    ; for the relative Offset
  513.     Move.l    (a0,d0.l),d1    ; 
  514.     Move.l    d1,BltCon0(a6)    ;
  515.     
  516.     Move.w    #4,d1    ; Amount of Bitplanes to blit
  517.     Muls    d1,d4    ; Multiply Height by 4,
  518.     Asl.w    #6,d4    ; Move Left 6 bits for reg
  519.     Or.w    #2,d4    ; Add X size (2 words)
  520.  
  521.     Move.w    d4,BltSize(a6)    ; Start Blitter!!
  522.     Rts
  523.  
  524. *****************************************************************************
  525.  
  526. BlitClear    Lea    $Dff000,a6
  527.     Move.l    Screen,a2    ;
  528.     Move.l    #$28*4,d4    ; Calc Y Screen Position
  529.     Muls    d1,d4    ;
  530.     Add.l    d4,a2    ;
  531.     
  532.     Moveq    #0,d1    ; 
  533.     Move.w    d0,d1    ; 
  534.     Asr.w    #3,d1    ; Calc X Screen Position
  535.     Bclr    #0,d1    ; (No need to Offset)
  536.     Add.l    d1,a2    ; 
  537.     
  538.     Bsr    BWait    ; Wait for Blitter
  539.     
  540.     Move.l    a2,BltDpth(a6)    ; Set Desination Regs only
  541.     Move.w    #36,BltDMod(a6)    ; 
  542.     
  543.     Move.l    #$ffffffff,BltAFWM(a6)  ; Full Mask
  544.     Move.l    #$01000000,BltCon0(a6)  ; Blit No-Operation
  545.         
  546.     Move.w    #4,d1    ; Amount of Bitplanes to blit
  547.     Muls    d1,d2    ; Multiply Height by 4,
  548.     Asl.w    #6,d2    ; Move Left 6 bits for reg
  549.     Or.w    #2,d2    ; Add X size (2 words)
  550.  
  551.     Move.w    d2,BltSize(a6)    ; Start Blitter!!
  552.     Rts
  553.  
  554. Randomize    Movem.l    d0-d1/a0,-(sp)    ; 
  555.     Move.l    RandPos,a0    ; 
  556.     Move.l    (a0)+,d0    ;  
  557.     Or.l    Screen,d0    ; Calculate a nice random
  558.     Move.l    XPos,d1    ; number..
  559.     Eor.l    d1,d0    ;
  560.     Add.l    (a0)+,d0    ; Using X & Y Pos, the
  561.     Add.l    Msecs,d0    ;
  562.     Move.l    $Dff004,d1    ;
  563.     Eor.l    d1,d0
  564.     Move.l    a0,RandPos    ; Kickstart ROM Data and
  565.     Add.l    d1,d0    ; the Screen Pointer.
  566.     Move.l    d0,RandNo    ;
  567.     Movem.l    (sp)+,d0-d1/a0    ;
  568.     Rts    
  569.  
  570. *****************************************************************************
  571.  
  572. NewAlien    Add.w    #1,AlienCount    ; Count 10 Frames before
  573.     Cmp.w    #10,AlienCount    ; releasing another alien
  574.     Beq    ReleaseAlien    ; onto the screen.
  575.     Rts
  576.  
  577. ReleaseAlien    Move.w    #0,AlienCount
  578.  
  579. APatt0    Move.l    RandNo,d0    ; Use the Random number for
  580.     And.w    #$1ff,d0    ; Alien X Pos, and Speed.
  581.     Cmpi.w    #299,d0    ; Alien off the screen?
  582.     Blt    NoSubit0    ;
  583.     Sub.w    #299,d0    ; Pull him back on then.
  584.     
  585. NoSubit0    Move.w    d0,AXPos
  586.     Move.l    RandNo,d0    ; 
  587.     Swap    d0    ; 
  588.     Asr.w    #8,d0    ; Find a Speed for this
  589.     And.w    #7,d0    ; New Alien chum..
  590.     Cmpi.b    #0,d0    ; 
  591.     Beq    NotZero0    ; 
  592.     Move.b    d0,d5    ; 
  593. DoSetA0    Move.w    #0,d6
  594.     Bsr    SetAlien    
  595.     Rts
  596. NotZero0    Move.w    #1,d5    ; But Not a 0 Speed
  597.     Bra    DoSetA0
  598.  
  599. *****************************************************************************
  600.     
  601. SetAlien    Lea    AlienTable,a0    ; Now find a free space in
  602. ALLoop    Move.w    0(a0),d0    ; the Alien movement chart
  603.     Cmp.w    #-1,d0    ; for our new friend..
  604.     Beq    FreeAlien    ; Found a Free Space??
  605.     Lea    8(a0),a0    ; Check Next Space if not..
  606.     Cmp.l    #AlienEnd,a0    ; But Find out if we've
  607.     Beq    ALTabEnd    ; run out of chart..
  608.     Bra    ALLoop    ;
  609.     
  610. FreeAlien    Move.b    d5,0(a0)    ; Put our new Alien 
  611.     Asl.w    #1,d6
  612.     Bset    #0,d6
  613.     Move.b    d6,1(a0)    ; characteristics into the
  614.     Move.w    AXPos,2(a0)    ; free chart Space..
  615.     Move.w    #0,4(a0)    ; 
  616.     Move.w    #0,6(a0)    ; 
  617. ALTabEnd    Rts
  618.  
  619. *****************************************************************************
  620.  
  621. MoveAliens    Lea    AlienTable,a0    ; 
  622.     Move.w    #19,d7    ; 
  623. MVALoop    Move.w    0(a0),d0    ; 
  624.     Cmp.w    #-1,d0    ; Test to see if the Alien
  625.     Bne    MoveAlien    ; is alive and kicking,
  626. DoMVALoop    Lea    8(a0),a0    ; if not, try the next one..
  627.     Dbf    d7,MVALoop    ; 
  628.     Rts        
  629.     
  630. MoveAlien    Asr.w    #1,d0
  631.     And.w    #$7f,d0
  632.     Cmpi.b    #00,d0
  633.     Beq    MVAPatt0
  634.     Bra    DoMVALoop
  635.     
  636. MVAPatt0    Moveq    #0,d6    ;
  637.     Move.b    0(a0),d6    ; Get Alien Speed
  638.     Add.w    d6,4(a0)    ; Add to its Y Position
  639.     Add.w    #1,6(a0)    ; Add 1 to the Alien frame
  640.     And.w    #$f,6(a0)    ; No more than 16 frames..
  641.     Cmp.w    #260,4(a0)    ; Is Alien off screen yet?
  642.     Bgt    ALOffScreen    ; Yes, then free his Chart
  643.     Bra    DoMVALoop    ; space, otherwise Next Alien 
  644.     
  645. ALOffScreen    Move.w    #-1,0(a0)    ; 
  646.     Move.w    #-1,2(a0)    ; Clear this Aliens
  647.     Move.w    #-1,4(a0)    ; characteristics out of
  648.     Move.w    #-1,6(a0)    ; the chart Space...
  649.     Bra    DoMVALoop    ; Next Alien Please...
  650.  
  651. *****************************************************************************
  652.  
  653. ShowAliens    Lea    AlienTable,a5    ; Now Show the Aliens in
  654.     Btst    #0,Altern8    ; the chart Spaces...
  655.     Bne    SaveA1    ; 
  656.     Lea    FCAliens0,a4    ; Which Alien list do we
  657.     Bra    SaveA2    ; want first...
  658. SaveA1    Lea    FCAliens1,a4    ; (Double Buffered)
  659. SaveA2    Move.w    #19,d7    ; 
  660.  
  661. DoSAliens    Move.w    (a5)+,d4    ; Get Alien Speed,
  662.     Move.w    (a5)+,d2    ; Alien X Position,
  663.     Move.w    (a5)+,d3    ; Y Position and
  664.     Move.w    (a5)+,d1    ; Frame
  665.         
  666.     Move.w    d4,(a4)+    ; Save Speed, X & Y and
  667.     Move.w    d2,(a4)+    ; Frame in our Double Buffer
  668.     Move.w    d3,(a4)+    ; List..
  669.     Move.w    d1,(a4)+    ; 
  670.  
  671.     Cmp.w    #-1,d4    ; Is Alien Active?
  672.     Beq    NoShowAlien    ; No, then Don't Blit then..
  673.  
  674.     Lea    AlienGFX1,a0
  675.     Lea    AlienMask1,a1
  676.     Move.w    #AlienType,d0    ; GFX Row
  677.     Move.w    #16,d4    ; 16 Pixels for Alien
  678.     Bsr    Blitter
  679.  
  680. NoShowAlien    Dbf    d7,DoSAliens
  681.     Rts
  682.  
  683. *****************************************************************************
  684.  
  685. ClearAliens    Btst    #0,Altern8    ; As Above Routine, but
  686.     Bne    LoadA1    ; clear screen instead of
  687.     Lea    FCAliens0,a4    ; Blit Alien...
  688.     Bra    LoadA2
  689. LoadA1    Lea    FCAliens1,a4    
  690. LoadA2    Move.w    #19,d7
  691. DoCAliens    Move.w    (a4)+,d4
  692.     Move.w    (a4)+,d0
  693.     Move.w    (a4)+,d1
  694.     Move.w    (a4)+,d3
  695.  
  696.     Cmp.w    #-1,d4
  697.     Beq    NoClearAlien
  698.     
  699.     Move.w    #16,d2
  700.     Bsr    BlitClear
  701.  
  702. NoClearAlien    Dbf    d7,DoCAliens
  703.     Rts
  704.     
  705. *****************************************************************************
  706.  
  707. CheckBullets    Lea    BullTable,a0    ; Now to check all the
  708.     Move.w    #7,d7    ; bullets to see if they
  709. CBullLoop0    Move.w    0(a0),d0    ; manage to hit any Aliens..
  710.     Move.w    2(a0),d1    ; Get Bullet X & Y..
  711.     Cmp.w    #-1,d0    ; If bullet inactive then
  712.     Beq    NoBullCheck    ; try next one..
  713.     Sub.w    #7,d0    ; 
  714.     Lea    AlienTable,a1    ; 
  715.     Move.w    #19,d6    ; 
  716. CBullLoop1    Move.w    0(a1),d3
  717.     Cmp.w    #-1,d3
  718.     Beq    OutOfRange
  719.     Move.w    2(a1),d3    ; Get Alien X & Y Positions.
  720.     Move.w    4(a1),d4    ; 
  721.     
  722.     Cmp.w    d0,d3    ; Is Bullet Outside Alien X
  723.     Blt    OutOfRange    ; Position??
  724.     
  725.     Sub.w    #16,d3    ; Is Bullet Outside Still
  726.     Cmp.w    d0,d3    ; Outside 16 pixel Offset??
  727.     Bgt    OutOfRange    ; 
  728.  
  729.     Cmp.w    d1,d4    ; Now do the same with the
  730.     Blt    OutOfRange    ; Y Position..
  731.     
  732.     Sub.w    #16,d4    ; And Again..
  733.     Cmp.w    d1,d4    ; 
  734.     Bgt    OutOfRange    ; 
  735.     
  736. Collide    Move.b    0(a1),d6    ; Get Speed of Alien..
  737.     Move.w    2(a1),d3    ; Get Alien X & Y Positions.
  738.     Move.w    4(a1),d4    ; 
  739.     
  740.     Move.w    #-1,0(a1)    ; Now Clear Aliens
  741.     Move.w    #-1,2(a1)    ; Characteristics. He's Dead!
  742.     Move.w    #-1,4(a1)    ; 
  743.     Move.w    #-1,6(a1)    ; 
  744.     
  745.     And.b    #$f,d6    ; Get the Aliens Speed and
  746.     Add.l    d6,Score    ; add to the score..
  747.     
  748.     Movem.l    d0-d7/a0-a6,-(sp)
  749.     Bsr    DoScore
  750.     Movem.l    (sp)+,d0-d7/a0-a6
  751.     
  752.     Move.l    #-1,(a0)    ; Kill the Bullet..
  753.  
  754.     Move.w    d3,d5
  755.     Move.w    d4,d6
  756.     Bsr    SetExplosion
  757.     
  758.     Move.w    d3,d0
  759.     Move.w    d4,d1
  760.     Move.w    #16,d2
  761.     Bsr    BlitClear
  762.  
  763.     Bra    NoBullCheck
  764.         
  765. OutOfRange    Lea    8(a1),a1    ; Now do the Next Alien
  766.     Dbf    d6,CBullLoop1    ; 
  767. NoBullCheck    Add.l    #4,a0
  768.     Dbf    d7,CBullLoop0    ; And now the next bullet...
  769.     Rts
  770.  
  771. *****************************************************************************
  772.  
  773. CheckAliens    Move.w    XPos,d0    ; Get Ship X & Y Positions..
  774.     Move.w    YPos,d1    ;
  775.     Move.w    d0,d5    ; Remember the X & Y for the
  776.     Move.w    d1,d6    ; Explosion if necessary..
  777.  
  778.     Sub.w    #7,d0    ; 
  779.     Sub.w    #10,d1
  780.     Lea    AlienTable,a1    ; 
  781.     Move.w    #19,d7    ; 
  782. CAlienLoop    Move.w    0(a1),d3
  783.     Cmp.w    #-1,d3
  784.     Beq    ALOutOfRange
  785.     Move.w    2(a1),d3    ; Get Alien X & Y Positions.
  786.     Move.w    4(a1),d4    ; 
  787.     
  788.     Cmp.w    d0,d3    ; Is Ship Outside Alien X
  789.     Blt    ALOutOfRange    ; Position??
  790.     
  791.     Sub.w    #16,d3    ; Is Ship Outside Still
  792.     Cmp.w    d0,d3    ; Outside 16 pixel Offset??
  793.     Bgt    ALOutOfRange    ; 
  794.  
  795.     Cmp.w    d1,d4    ; Now do the same with the
  796.     Blt    ALOutOfRange    ; Y Position..
  797.     
  798.     Sub.w    #16,d4    ; And Again..
  799.     Cmp.w    d1,d4    ; 
  800.     Bgt    ALOutOfRange    ; 
  801.     
  802. CollideAlien    Add.l    #50,Score    ; Bonus for dying!!
  803.     
  804.     Movem.l    d0-d7/a0-a6,-(sp)  ; 
  805.     Bsr    SubLives       ; Now Display Lives amount
  806.     Movem.l    (sp)+,d0-d7/a0-a6  ; 
  807.     
  808.     Move.w    #32,DeadCount    ; Start Death Sequence
  809.  
  810.     Bsr    SetExplosion
  811.  
  812.     Bra    NoAlienCheck
  813.         
  814. ALOutOfRange    Lea    8(a1),a1    ; Now do the Next Alien
  815.     Dbf    d7,CAlienLoop    ; 
  816. NoAlienCheck    Rts
  817.  
  818. *****************************************************************************
  819.  
  820. SetExplosion    Lea    ExploTable,a3    ; 
  821. NextExplosion    Cmp.w    #-1,0(a3)    ; Find an unused Explosion in
  822.     Beq    FreeExplosion    ; the table and set its new
  823.     Lea    6(a3),a3    ; position...
  824.     Cmp.l    #ExploEnd,a3    ; 
  825.     Beq    NoMoreExplo    ; 
  826.     Bra    NextExplosion    ; 
  827.             ; 
  828. FreeExplosion    Move.w    d5,0(a3)    ; 
  829.     Move.w    d6,2(a3)    ; 
  830.     Move.w    #0,4(a3)    ; 
  831. NoMoreExplo    Rts
  832.  
  833. *****************************************************************************
  834.  
  835. UpdateExplo    Lea    ExploTable,a0    ;  
  836.     Move.w    #19,d7    ; 
  837. ExploULoop    Cmp.w    #-1,0(a0)    ; Is Explosion Active?
  838.     Beq    NextUExplosion    ; do next one if not..
  839.     Add.w    #1,4(a0)    ; Add 1 to the Explosion
  840.     Cmp.w    #18,4(a0)    ; Frame, if Last frame then
  841.     Beq    KillExplosion    ; kill the Explosion....
  842. NextUExplosion    Add.l    #6,a0    ; Do next explosion now
  843.     Dbf    d7,ExploULoop    ; 
  844.     Rts        ; 
  845.     
  846. KillExplosion    Move.l    #-1,0(a0)    ; Kill Explosion Positions
  847.     Move.w    #-1,4(a0)    ; and free its table space.
  848.     Bra    NextUExplosion    ; Next Explosion please..
  849.  
  850. *****************************************************************************
  851.  
  852. ShowExplosions    Lea    ExploTable,a5    ; Now Show the Explosions in
  853.     Btst    #0,Altern8    ; the chart Spaces...
  854.     Bne    SaveEX1    ; 
  855.     Lea    FCExplo0,a4    ; Which Explo list do we
  856.     Bra    SaveEX2    ; want first...
  857. SaveEX1    Lea    FCExplo1,a4    ; (Double Buffered)
  858. SaveEX2    Move.w    #19,d7    ; 
  859.  
  860. DoSExplo    Move.w    (a5)+,d2    ; Explosion X Position and
  861.     Move.w    (a5)+,d3    ; Y Position...
  862.     Move.w    (a5)+,d1    ;
  863.         
  864.     Move.w    d2,(a4)+    ; Store Frame in our Double
  865.     Move.w    d3,(a4)+    ; Buffer List..
  866.             ;
  867.     Cmpi.w    #-1,d2    ;
  868.     Beq    NoShowExplo    ;
  869.             ;
  870.     Lea    AlienGFX1,a0    ;
  871.     Lea    AlienMask1,a1    ;
  872.     Move.w    #1,d0    ;
  873.     Move.w    #16,d4    ;
  874.     Bsr    Blitter    ;
  875.             ;
  876. NoShowExplo    Dbf    d7,DoSExplo    ;
  877.     Rts    
  878.  
  879. *****************************************************************************
  880.  
  881. ClearExplosions    Btst    #0,Altern8    ; As Above Routine, but
  882.     Bne    LoadEX1    ; clear screen instead of
  883.     Lea    FCExplo0,a4    ; Blit Alien...
  884.     Bra    LoadEX2
  885. LoadEX1    Lea    FCExplo1,a4    
  886. LoadEX2    Move.w    #19,d7
  887. DoCExplo    Move.w    (a4)+,d0
  888.     Move.w    (a4)+,d1
  889.  
  890.     Cmpi.w    #-1,d0    ;
  891.     Beq    NoClearExplo    ;
  892.             ;
  893.     Move.w    #16,d2    ;
  894.     Bsr    BlitClear    ;
  895.             ;
  896. NoClearExplo    Dbf    d7,DoCExplo    ;
  897.     Rts
  898.     
  899. *****************************************************************************
  900.     
  901. DoText    Movem.l    d0-d7/a0-a6,-(sp)
  902.     Move.l    TextPT,a0
  903.     Moveq    #0,d6
  904.     Move.w    TextMod,d6
  905.     Move.w    #0,CXPos
  906. NextChar    Moveq    #0,d0
  907.     Move.b    (a0)+,d0
  908.     Cmp.b    #0,d0
  909.     Beq    TextEnd
  910.     
  911.     Sub.b    #32,d0
  912.     Asl.w    #3,d0
  913.  
  914. CharShow    Lea    FontGFX,a4
  915.     Add.l    d0,a4
  916.     Move.l    TextSC,a5
  917.     Moveq    #0,d0
  918.     Move.w    CXPos,d0
  919.     Add.l    d0,a5
  920.     
  921.     Move.w    #7,d7
  922. CharCopy    Move.b    (a4)+,(a5)
  923.     Add.l    d6,a5
  924.     Dbf    d7,CharCopy
  925.  
  926. Space    Add.w    #1,CXPos
  927.     Bra    NextChar
  928.  
  929. TextEnd    Movem.l    (sp)+,d0-d7/a0-a6
  930.     Rts
  931.  
  932. DoScore    Move.l    Score,d6
  933.     Lea    ScoreNo,a0
  934.  
  935. DoScoreC    Move.l    #10000,d1
  936.     Bsr    DoDivs
  937. DoThousands    Move.l    #1000,d1
  938.     Bsr    DoDivs
  939. DoHundreds    Move.l    #100,d1
  940.     Bsr    DoDivs
  941. DoTens    Move.l    #10,d1
  942.     Bsr    DoDivs
  943. DoUnits    Move.l    #1,d1
  944.     Bsr    DoDivs
  945.     
  946.     Move.l    #TextPiccy,TextSC
  947.     Move.l    #ScoreText,TextPT
  948.     Move.w    #40,TextMod
  949.     Bsr    DoText
  950.     
  951.     Rts
  952.         
  953. DoGetReadyMSG    Move.l    #GetReadyText,TextPT
  954.     Bra    DoMSG
  955. DoGameOverMSG    Move.l    #GameOverText,TextPT
  956. DoMSG    Move.l    #Piccy1+(40*4*120),TextSC
  957.     Move.w    #160,TextMod
  958.     Move.w    #0,CXPos
  959.     Bsr    DoText
  960.     Move.l    #Piccy2+(40*4*120),TextSC
  961.     Move.w    #0,CXPos
  962.     Bsr    DoText
  963.     Rts        
  964.     
  965. DoDivs    Divs    d1,d6    
  966.     Move.w    d6,d5
  967.     And.w    #$f,d5
  968.     Add.w    #48,d5
  969.     Move.b    d5,(a0)+    
  970.     Move.w    #0,d6
  971.     Swap    d6
  972.     Rts
  973.     
  974. SubLives    Sub.w    #1,Lives
  975.     Cmp.w    #-1,Lives
  976.     Bne    DoLives
  977.     Rts
  978. DoLives    Move.w    Lives,d6
  979.     Lea    LivesNo,a0
  980.     Bra    DoTens
  981.  
  982. *****************************************************************************
  983.  
  984. BWait    Btst    #14,$Dff002    ; Test Blitter status bit
  985.     Bne    BWait    ; Not ready? Try again..
  986.     Rts
  987.  
  988. *****************************************************************************
  989.  
  990. KillSys    Bsr    SysWait    ; Wait for System to Relax
  991.  
  992.     Move.l    $4,a6    ; Find EXEC Base
  993.     Lea    GFXLibName,a1    ; Point to Library Name
  994.     Moveq    #0,d0    ; Open GFX Library, to find
  995.     Jsr    -552(a6)    ; Old Copperlist
  996.     Lea    OldCopper,a5    ;
  997.     Move.l    $26(a0),(a5)    ; Save old CopperList
  998.     
  999.     Lea    $Dff000,a6    ; Base of Custom Registers
  1000.     Move.w    IntEnaR(a6),d0    ; Find Old Interupts
  1001.     Move.w    DMAConR(a6),d1    ; And Old DMA Control
  1002.     Or.w    #$8000,d0    ; 
  1003.     And.w    #$03ff,d1    ; Process Values for Exit
  1004.     Or.w    #$8000,d1    ; 
  1005.     Move.w    #$7fff,IntEna(a6)  ; Kill Ints
  1006.     Move.w    #$7fff,DMACon(a6)  ; Kill DMA
  1007.     Move.w    d0,$4(a5)    ; Remember Ints & DMA
  1008.     Move.w    d1,$6(a5)    ; 
  1009.     
  1010.     Bset    #1,$Bfe001    ; Switch off Sound Filter
  1011.     Rts
  1012.  
  1013. *****************************************************************************
  1014.  
  1015. SysWait    Move.w    #15,d7    ; Pause a brief while to 
  1016. SWLoop1    Move.w    #$1000,d0    ; allow Devpac to settle
  1017. SWLoop2    Move.w    d7,$Dff180    ; down, because the Keyboard
  1018.     Move.w    d7,$Dff182    ; routine gets upset if you
  1019.     Move.w    d7,$Dff184    ; kill the system before
  1020.     Move.w    d7,$Dff186    ; you release the keys..
  1021.     Dbf    d0,SWLoop2    ; (Colour change not 
  1022.     Dbf    d7,SWLoop1    ; essential, but pretty..)
  1023.     Rts
  1024.  
  1025. *****************************************************************************
  1026.  
  1027. ReturnSys    Lea    $Dff000,a6
  1028.     Move.w    OldIntEna,IntEna(a6)  ; Replace System Ints,
  1029.     Move.w    OldDMACon,DMACon(a6)  ; DMA Control
  1030.     Move.l    OldCopper,Cop1lc(a6)  ; And Old Copperlist
  1031.     Rts
  1032.         
  1033. *****************************************************************************
  1034.  
  1035. TrackMouse    Lea    $Dff000,a6
  1036.     Move.w    Joy0Dat(a6),d0    ; Register for Mouse port
  1037.     Move.b    OldX,d1    ;
  1038.     Move.b    d0,OldX    ;
  1039.     Sub.b    d0,d1    ; Calc X Position of Mouse
  1040.     Ext.w    d1    ;
  1041.     Sub.w    d1,XPos    ;
  1042.     
  1043.     Lsr.w    #8,d0    ; Get Y Pos Data
  1044.     Move.b    OldY,d1    ;
  1045.     Move.b    d0,OldY    ;
  1046.     Sub.b    d0,d1    ; Calc Y Position of Mouse
  1047.     Ext.w    d1    ;
  1048.     Sub.w    d1,YPos    ;
  1049.     
  1050.     Move.w    XPos,d0    ; Store X and Y Positions
  1051.     Move.w    YPos,d1    ;
  1052.     
  1053.     Btst    #6,$Bfe001
  1054.     Bne    NoLMB
  1055.     
  1056.     Lea    MoveFlag,a5    ; Set flags to indicate
  1057.     Move.w    #0,(a5)    ; Fire button pressed.
  1058.     Bset    #4,(a5)    ; 
  1059.     Bset    #5,(a5)    ; 
  1060.  
  1061. NoLMB    Rts
  1062.  
  1063. *****************************************************************************
  1064.  
  1065. SetMouse    Lea    $Dff000,a6    ;
  1066.     Move.w    Joy0Dat(a6),d0    ; Set the Mouse Position
  1067.     Move.b    d0,OldX    ;
  1068.     Lsr.w    #8,d0    ;
  1069.     Move.b    d0,OldY    ;
  1070.     Rts
  1071.  
  1072. *****************************************************************************
  1073.     
  1074. TrackStick    Lea    MoveFlag,a5    ; Flags for Ship Movement
  1075.     Lea    $Dff000,a6    
  1076.     
  1077. TestJoy    And.w    #%11000000,(a5)    
  1078.     Move.w    Joy1Dat(a6),d0  ; The Joystick Port        
  1079.     Btst    #1,d0            
  1080.     Beq    JoyLeft    
  1081.     
  1082. GoRight    Bset    #0,(a5)
  1083.     Bset    #5,(a5)
  1084.     
  1085. JoyLeft    Btst    #9,d0            
  1086.     Beq    JoyDown
  1087.  
  1088. GoLeft    Bset    #1,(a5)
  1089.     Bset    #5,(a5)
  1090.     
  1091. JoyDown    Move.w    d0,d1            
  1092.     Lsr.w    #1,d1            
  1093.     Eor.w    d0,d1            
  1094.     Btst    #0,d1            
  1095.     Beq    JoyUp
  1096.  
  1097. GoDown    Bset    #2,(a5)
  1098.     Bset    #5,(a5)
  1099.  
  1100. JoyUp    Btst    #$8,d1           
  1101.     Beq    JoyFire
  1102.  
  1103. GoUp    Bset    #3,(a5)
  1104.     Bset    #5,(a5)
  1105.  
  1106. JoyFire    Btst    #7,$Bfe001
  1107.     Bne    NoJoyFire
  1108.  
  1109. GoFire    Bset    #4,(a5)
  1110.     Bset    #5,(a5)
  1111.  
  1112. NoJoyFire    Rts
  1113.  
  1114. *****************************************************************************
  1115.  
  1116. ScoreText    Dc.b    " Score "
  1117. ScoreNo    Dc.b    "0000000   Lives "
  1118. LivesNo    Dc.b    "00   Hi "
  1119. HiScoreNo    Dc.b    "0000000",0
  1120.     Even
  1121.     
  1122. BlankText    Dc.b    "                                       "    
  1123. GetReadyText    Dc.b    "               GET READY..            ",0
  1124. GameOverText    Dc.b    "               GAME OVER..            ",0
  1125.     Even
  1126.  
  1127. *****************************************************************************
  1128. * Variables                                                                 *
  1129. *****************************************************************************
  1130.  
  1131. GFXLibName    Dc.b    "graphics.library",0,0,0,0
  1132.  
  1133. OldCopper    Dc.l    0    ;
  1134. OldIntEna    Dc.w    0    ; System Variables.
  1135. OldDmaCon    Dc.w    0    ;
  1136.  
  1137. OldX    Dc.b    0    ; Mouse Variables.
  1138. OldY    Dc.b    0    ;
  1139.  
  1140. XPos    Dc.w    0    ; Ship X & Y Co-ords.
  1141. YPos    Dc.w    0    ;
  1142.  
  1143. AXPos    Dc.w    0    ; Alien X & Y Co-ords.
  1144. AYPos    Dc.w    0    ;
  1145.  
  1146. FCXPos0    Dc.w    0    ; Double Buffer X & Y 0.
  1147. FCYPos0    Dc.w    0    ;
  1148.  
  1149. FCXPos1    Dc.w    0    ; Double Buffer X & Y 1.
  1150. FCYPos1    Dc.w    0    ;
  1151.  
  1152. CXPos    Dc.w    0    ; Font Print X & Y Co-ords.
  1153. CYPos    Dc.w    0    ; 
  1154.  
  1155. Frame    Dc.w    0    ; Ship Frame No.
  1156. AFrame    Dc.w    0    ; Alien Frame No.
  1157.  
  1158. MoveFlag    Dc.w    0    ; Ships Movement Flags.
  1159.  
  1160. Speed    Dc.w    4    ; Ships Speed.
  1161. BullSpeed    Dc.w    8    ; Bullets Speed.
  1162.  
  1163. BulletCount    Dc.w    0    ; Bullet Frame Counter.
  1164.  
  1165. Screen    Dc.l    Piccy1    ; Screen Address pointer.
  1166. Altern8    Dc.w    0    ; Double Buffer Alternate.
  1167.  
  1168. AlienCount    Dc.w    0    ; Alien Release Counter
  1169. PattFrameCount    Dc.w    0    ; Alien Frame Counter.
  1170.  
  1171. MSecs    Dc.w    0    ; Clock 50ths,
  1172. Secs    Dc.w    0    ; Seconds,
  1173. Mins    Dc.w    0    ; Minutes,
  1174. Hours    Dc.w    0    ; Hours.
  1175.  
  1176. RandPos    Dc.l    $f80000    ; Pointer to the ROM.
  1177. RandNo    Dc.l    0    ; Random Generated Number.
  1178.  
  1179. Score    Dc.l    0    ; Players Score.
  1180. Lives    Dc.w    5    ; Ships Lives.
  1181.  
  1182. TextSC    Dc.l    0    ; Text Screen Pointer.
  1183. TextPT    Dc.l    0    ; Text Pointer.
  1184. TextMod    Dc.w    0    ; Text Modulo Width.
  1185.  
  1186. DeadCount    Dc.w    0
  1187.  
  1188. LevelPoint    Dc.l    Level1
  1189. LevCount    Dc.w    0
  1190.  
  1191. *****************************************************************************
  1192. * Tables                                                                    *
  1193. *****************************************************************************
  1194.  
  1195. BullTable            ; Bullets lie here..
  1196.     Rept    8
  1197.     Dc.w    -1,-1
  1198.     EndR
  1199. BullEnd    Dc.w    $0,0
  1200.  
  1201. FCBullets0            ; Bullets Double Buffer 0.
  1202.     Rept    8
  1203.     Dc.w    -1,-1
  1204.     EndR
  1205. FCBullets1            ; Bullets Double Buffer 1.
  1206.     Rept    8
  1207.     Dc.w    -1,-1
  1208.     EndR
  1209.  
  1210. AlienTable            ; Aliens lie in here...
  1211.     Rept    20
  1212.     Dc.w    -1,-1,-1,-1
  1213.     EndR
  1214. AlienEnd    Dc.w    $0,0
  1215.  
  1216. FCAliens0            ; Aliens Double Buffer 0.
  1217.     Rept    20
  1218.     Dc.w    0,0,0,0
  1219.     EndR
  1220. FCAliens1            ; Aliens Double Buffer 1.
  1221.     Rept    20
  1222.     Dc.w    0,0,0,0
  1223.     EndR
  1224.     
  1225. ExploTable    
  1226.     Rept    20
  1227.     Dc.w    -1,-1,-1
  1228.     EndR
  1229. ExploEnd    Dc.w    0,0
  1230.  
  1231. FCExplo0            ; Explo Double Buffer 0.
  1232.     Rept    20
  1233.     Dc.w    0,0,0,0
  1234.     EndR
  1235. FCExplo1            ; Explo Double Buffer 1.
  1236.     Rept    20
  1237.     Dc.w    0,0,0,0
  1238.     EndR
  1239.     
  1240. *****************************************************************************
  1241. * Alien Level Data                                                          *
  1242. *****************************************************************************
  1243.  
  1244. ; Data :-  No. of Patts in Set, Patt, Aline GFX, Score Each, $fff=End Marker
  1245. ;          Then Bonus for all killed
  1246.  
  1247. Level1    Dc.w    1,0,4,100,$fff
  1248.     Dc.w    -1,-1
  1249.  
  1250. *****************************************************************************
  1251. * Blitter Shift Data                                                        *
  1252. *****************************************************************************
  1253.     
  1254. BConShift    Dc.l    $0fca0000    ; This is for the Blitter
  1255.     Dc.l    $1fca1000    ; Control registers, to
  1256.     Dc.l    $2fca2000    ; save extra hassle they're
  1257.     Dc.l    $3fca3000    ; in this easy to look up
  1258.     Dc.l    $4fca4000    ; chart..
  1259.     Dc.l    $5fca5000    ;
  1260.     Dc.l    $6fca6000    ;
  1261.     Dc.l    $7fca7000    
  1262.     Dc.l    $8fca8000    
  1263.     Dc.l    $9fca9000    
  1264.     Dc.l    $afcaa000    
  1265.     Dc.l    $bfcab000    
  1266.     Dc.l    $cfcac000    
  1267.     Dc.l    $dfcad000    
  1268.     Dc.l    $efcae000    
  1269.     Dc.l    $ffcaf000    
  1270.  
  1271. *****************************************************************************
  1272. * Macros                                                                    *
  1273. *****************************************************************************
  1274.  
  1275. Cmv    Macro        ; CopperList Move Instruction
  1276.     Dc.w    \2,\1
  1277.     EndM
  1278.     
  1279. Cwt    Macro        ; CopperList Wait Instruction
  1280.     Dc.w    (\1*$100)+$01,$fffe
  1281.     EndM    
  1282.  
  1283. Pal    Macro        ; CopperList Pal Wait
  1284.     Dc.w    $ffe1,$fffe
  1285.     EndM    
  1286.  
  1287. EndCop    Macro        ; CopperList End
  1288.     Dc.w    $ffff,$fffe
  1289.     EndM    
  1290.  
  1291. *****************************************************************************
  1292. * CopperList                                                                *
  1293. *****************************************************************************
  1294.  
  1295. CopperList1    Cwt    $14    ; Wait for Off screen line
  1296.     Cmv    $0200,BplCon0    ; No Bitplanes - Clear
  1297.     Cmv    $0000,BplCon1    ; No Hardware Scroll Offset
  1298.     Cmv    $000a,BplCon2    ; Normal Bitplane Priority
  1299.     Cmv    $0032,DdfStrt    ; Data Fetch Start
  1300.     Cmv    $00d0,DdfStop    ; Data Fetch Stop
  1301.     Cmv    $163c,DiwStrt    ; Window Start
  1302.     Cmv    $36c1,DiwStop    ; Windto Stop
  1303.     
  1304.     Cwt    $15    ; Wait for Line $15
  1305.     
  1306.     Cmv    $0000,Color16    ;    
  1307.     Cmv    $0000,Color17    ;
  1308.     Cmv    $0000,Color18    ;
  1309.     Cmv    $0000,Color19    ;
  1310.     Cmv    $0000,Color20    ;
  1311.     Cmv    $0000,Color21    ; Unused Colours
  1312.     Cmv    $0000,Color22    ;
  1313.     Cmv    $0000,Color23    ;
  1314.     Cmv    $0000,Color24    ;
  1315.     Cmv    $0000,Color25    ;
  1316.     Cmv    $0000,Color26    ;
  1317.     Cmv    $0000,Color27    ;
  1318.     Cmv    $0000,Color28    ;
  1319.     Cmv    $0000,Color29    ;
  1320.     Cmv    $0000,Color30    ;
  1321.     Cmv    $0000,Color31    ;
  1322.     
  1323.     Cwt    $2f    ; Wait for Line $2f
  1324.     Cmv    $0f00,Color00
  1325.     Cmv    $000f,Color01
  1326.  
  1327.     Cmv    -2,BplMod1  ; PlayField 1 Modulo
  1328.     Cmv    -2,BplMod2  ; PlayField 2 Modulo
  1329.     
  1330. TextBpls    Cmv    $000d,BplPt0h    ;
  1331.     Cmv    $0000,BplPt0l    ;
  1332.  
  1333.     Cmv    $1200,BplCon0    
  1334.  
  1335.     Cwt    $30
  1336.     Cmv    $0f03,Color00
  1337.     Cmv    $033f,Color01
  1338.     Cwt    $31
  1339.     Cmv    $0d05,Color00
  1340.     Cmv    $055d,Color01
  1341.     Cwt    $32
  1342.     Cmv    $0b07,Color00
  1343.     Cmv    $077b,Color01
  1344.     Cwt    $33
  1345.     Cmv    $0909,Color00
  1346.     Cmv    $0999,Color01
  1347.     Cwt    $34
  1348.     Cmv    $070b,Color00
  1349.     Cmv    $0bb7,Color01
  1350.     Cwt    $35
  1351.     Cmv    $050d,Color00
  1352.     Cmv    $0dd5,Color01
  1353.     Cwt    $36
  1354.     Cmv    $030f,Color00
  1355.     Cmv    $0ff3,Color01
  1356.  
  1357.     Cwt    $37
  1358.     Cmv    $0200,BplCon0    
  1359.     Cmv    (3*$28)-2,BplMod1  ; PlayField 1 Modulo
  1360.     Cmv    (3*$28)-2,BplMod2  ; PlayField 2 Modulo
  1361.  
  1362. Bpl0    Cmv    $000b,BplPt0h    ;
  1363.     Cmv    $0000,BplPt0l    ;
  1364. Bpl1    Cmv    $000b,BplPt1h    ; Set PlayField 1 BitPlanes
  1365.     Cmv    $0028,BplPt1l    ;
  1366. Bpl2    Cmv    $000b,BplPt2h    ;
  1367.     Cmv    $0050,BplPt2l    ;    
  1368. Bpl3    Cmv    $000b,BplPt3h    ;
  1369.     Cmv    $0078,BplPt3l    ;
  1370.         
  1371.     Cwt    $38    ; Wait for Line $38
  1372.     Cmv    $4200,BplCon0    ; 6 Planes & Dual PlayField
  1373.  
  1374. CopperCOLS    Cmv    $0000,Color00    ;
  1375.     Cmv    $0000,Color01    ;
  1376.     Cmv    $0000,Color02    ;
  1377.     Cmv    $0000,Color03    ; PlayField 1 Colours
  1378.     Cmv    $0000,Color04    ;
  1379.     Cmv    $0000,Color05    ;
  1380.     Cmv    $0000,Color06    ;
  1381.     Cmv    $0000,Color07    ;    
  1382.     Cmv    $0000,Color08    ;
  1383.     Cmv    $0000,Color09    ;
  1384.     Cmv    $0000,Color10    ;
  1385.     Cmv    $0000,Color11    ;
  1386.     Cmv    $0000,Color12    ;
  1387.     Cmv    $0000,Color13    ;
  1388.     Cmv    $0000,Color14    ;
  1389.     Cmv    $0000,Color15    ;
  1390.     
  1391.     Pal        ; Wait For Pal
  1392.     Cwt    $28    ; Wait For Line $12f
  1393.  
  1394.     Cmv    $0200,BplCon0    ; Switch off BitPlanes
  1395.     Cmv    $0000,Color00    ; Black into Colour 0
  1396.     
  1397.     EndCop        ; End the CopperList
  1398.  
  1399. *****************************************************************************
  1400. * External Data                                                             *
  1401. *****************************************************************************
  1402.  
  1403. BlackOut    Dc.w    0,0,0,0,0,0,0,0
  1404.     Dc.w    0,0,0,0,0,0,0,0
  1405.  
  1406. PiccyCols0    Dc.w    $000,$fff,$aaa,$555,$8af,$55d,$32b,$309
  1407.     Dc.w    $ff0,$fa0,$f50,$f00,$0f5,$0b2,$071,$030
  1408.  
  1409. PiccyCols1    Dc.w    $000,$fff,0,0,0,0,0,0
  1410.     Dc.w    0,0,0,0,0,0,0,0
  1411.  
  1412.     Incdir    Df1:ShootEmUp
  1413.  
  1414. AlienGFX1    Incbin    Aliens16.Raw        ; Blitter Graphics
  1415. AlienMask1    Incbin    Aliens16.Mask       ; Blitter Mask
  1416. FontGFX    Incbin    Font.Raw             ; Font Graphics
  1417.  
  1418. TextPiccy    Ds.b    400
  1419.  
  1420. BlitBuffer    Ds.b    (44*4*10)    ; For Off screen blitting so
  1421.             ; DO NOT REMOVE!! 
  1422.  
  1423. Piccy1    Ds.b    (44*4*280)
  1424. Piccy2    Ds.b    (44*4*280)
  1425.     
  1426. *****************************************************************************
  1427. * Custom Chip Registers                                                     *
  1428. *****************************************************************************
  1429.  
  1430. ;Control Registers
  1431.  
  1432. Dmaconr    = $002
  1433. Vposr    = $004
  1434. Vhposr    = $006
  1435. Joy0dat    = $00A
  1436. Joy1dat    = $00C
  1437. Clxdat    = $00E
  1438. Intenar    = $01C
  1439. Intereqr    = $01E
  1440. Copcon    = $02E
  1441.  
  1442. ;Blitter Registers
  1443.  
  1444. Bltcon0    = $040
  1445. Bltcon1    = $042
  1446. Bltafwm    = $044
  1447. Bltalwm    = $046
  1448. Bltcpth    = $048
  1449. Bltcptl    = $04A
  1450. Bltbpth    = $04C
  1451. Bltbptl    = $04E
  1452. Bltapth    = $050
  1453. Bltaptl    = $052
  1454. Bltdpth    = $054
  1455. Bltdptl    = $056
  1456. Bltsize    = $058
  1457. Bltcmod    = $060
  1458. Bltbmod    = $062
  1459. Bltamod    = $064
  1460. Bltdmod    = $066
  1461. Bltcdat    = $070
  1462. Bltbdat    = $072
  1463. Bltadat    = $074
  1464.  
  1465. ;Copper Registers
  1466.  
  1467. Cop1lc    = $080
  1468. Cop1lch    = $080
  1469. Cop1lcl    = $082
  1470. Cop2lc    = $084
  1471. Cop2lch    = $084
  1472. Cop2lcl    = $086
  1473. Copjmp1    = $088
  1474. Copjmp2    = $08A
  1475. Diwstrt    = $08E
  1476. Diwstop    = $090
  1477. Ddfstrt    = $092
  1478. Ddfstop    = $094
  1479. Dmacon    = $096
  1480. Clxcon    = $098
  1481. Intena    = $09A
  1482. Intreq    = $09C
  1483.  
  1484. ;BitPlane Registers 
  1485.  
  1486. BplCon0    = $100
  1487. BplCon1    = $102
  1488. BplCon2    = $104
  1489. BplMod1    = $108
  1490. BplMod2    = $10a
  1491.  
  1492. BplPt0h    = $0e0
  1493. BplPt0l    = $0e2
  1494. BplPt1h    = $0e4
  1495. BplPt1l    = $0e6
  1496. BplPt2h    = $0e8
  1497. BplPt2l    = $0ea
  1498. BplPt3h    = $0ec
  1499. BplPt3l    = $0ee
  1500. BplPt4h    = $0f0
  1501. BplPt4l    = $0f2
  1502. BplPt5h    = $0f4
  1503. BplPt5l    = $0f6
  1504.  
  1505. ;Colorour Registers
  1506.  
  1507. Color00    = $180
  1508. Color01    = $182
  1509. Color02    = $184
  1510. Color03    = $186
  1511. Color04    = $188
  1512. Color05    = $18a
  1513. Color06    = $18c
  1514. Color07    = $18e
  1515. Color08    = $190
  1516. Color09    = $192
  1517. Color10    = $194
  1518. Color11    = $196
  1519. Color12    = $198
  1520. Color13    = $19a
  1521. Color14    = $19c
  1522. Color15    = $19e
  1523. Color16    = $1a0
  1524. Color17    = $1a2
  1525. Color18    = $1a4
  1526. Color19    = $1a6
  1527. Color20    = $1a8
  1528. Color21    = $1aa
  1529. Color22    = $1ac
  1530. Color23    = $1ae
  1531. Color24    = $1b0
  1532. Color25    = $1b2
  1533. Color26    = $1b4
  1534. Color27    = $1b6
  1535. Color28    = $1b8
  1536. Color29    = $1ba
  1537. Color30    = $1bc
  1538. Color31    = $1be
  1539.  
  1540.  
  1541.  
  1542.  
  1543.  
  1544.  
  1545.  
  1546.  
  1547.  
  1548.